＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝

                        PC-FXGAオーサリングソフトウェア
                    『ＧＭＡＫＥＲ』スタータキット(Ver.1.1)
                          Ｃコンパイラ関連ツールの解説
            (fxcc.exe,fxcp.exe,fxc0.exe,fxc1.exe,fxas.exe:Ver.1.1)

                                        日本電気ホームエレクトロニクス株式会社
                                                        １９９６年０５月３０日

＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝

目次

第１章  Ｃコンパイラ概要

第２章  注意事項
２．１  注意事項

第３章  Ｃコンパイラの動作

第４章  Ｃコンパイラの処理
４．１  プリプロセッサ部
４．２  構文解析部
４．３  コード最適化部（グローバル）
４．４  コード生成部
４．５  コード最適化部（ローカル）
４．６  処理の流れ

第５章  レジスタの用途

第６章  言語仕様
６．１  プリプロセッサ命令
６．２  データの種類
６．３  型変換
６．４  特殊仕様
６．４．１    レジスタ使用制限（使用禁止）の指定
６．４．２    変数のレジスタ割り付け
６．４．３    レジスタのセーブ指定
６．４．４    レジスタの直接表記
６．４．５    Ｉ／Ｏポートアクセスの表記
６．４．６    interrupt 型関数
６．４．７    zero 記憶クラス修飾子
６．４．８    near 記憶クラス修飾子
６．４．９    far 記憶クラス修飾子
６．４．１０  near 属性（ＧＰレジスタ相対）シンボルについて

第７章  Ｃコンパイラの使用書式
７．１  コマンド入力の形式
７．２  オプションスイッチ

第８章  エラー・ワーニング メッセージ
８．１  致命的なエラー（Fatal）
８．２  エラー （Error）
８．３  ワーニング （Warning）

＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝

第１章  Ｃコンパイラ概要


本コンパイラは、Ｃ言語で記述されているプログラムを読み込み、Ｖ８１０用の命令コ
ードを生成するコンパイラです。

又、本コンパイラはＣの標準であるＡＮＳＩ規格に準拠していますがＣの言語仕様には
ない特殊な処理（書式）もコンパイルできるようになっています。

参考文献：
『プログラミング言語Ｃ第２版  － ＡＮＳＩ規格準拠 －』
Ｂ.Ｗ.カーニハン／Ｄ.Ｍ.リッチー著  石田晴久 訳
共立出版 株式会社


＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝

第２章  注意事項

■２．１ 注意事項

本コンパイラでは、スタックポインタ及び、gpレジスタの初期値を設定するスタートア
ップルーチンとして_STARTUP.Oを用意しております。

本コンパイラを使用してプログラム開発を行う時は、必ず指定の_STARTUP.Oをリンクす
るようにして下さい。

通常Ｃ言語では、関数の外で定義された変数等の外的変数および静的変数が、明示的な
初期化がないときには、0に初期化されることが保証されていますが、システム構成上、
0に初期化されていることを前提にしているプログラムやこれらの変数を明示的に初期化
しているものを作成した場合には、プログラム自身が変数領域の初期化を設定しなけれ
ばならないので注意が必要です。

＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝

第３章  Ｃコンパイラの動作

Ｃコンパイラは、指定されたファイル名（拡張子を判定）スイッチを判定し、各フェー
ズの制御をしながらコンパイル処理を行います。

指定されたファイル名によっては、コンパイル処理を行わず、アセンブラ（FXAS.EXE）
リンカ（FXLK.EXE）を起動しオブジェクトファイル、実行ファイルを作成します。

指定できるファイル名は4種類で、それぞれ以下に説明する動作を行います。（但し、
スイッチが何も指定されていなかった場合です）


・Ｃソースファイル（.c）
コンパイル、アセンブル、リンク処理を行い、実行ファイルを作成します。

・アセンブラソースファイル（.s） ＊
アセンブル、リンク処理を行い、実行ファイルを作成します。

・オブジェクトファイル（.o）
リンク処理のみを行い、実行ファイルを作成します。

・アーカイブファイル（.a）
リンク処理を行う時、ライブラリファイルとして指定します。


＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝

第４章  Ｃコンパイラの処理


Ｃコンパイラは処理の概念として、プリプロセッサ部、構文解析部、コード生成部、コ
ード最適化部という４つのフェーズに分けられています。

それぞれ以下に示す実行ファイルが、ＣＣドライバという実行ファイルに制御され、上
記処理を行なっています。

(1)FXCC.EXE        ：  ＣＣドライバ

(2)FXCP.EXE        ：  プリプロセッサ部

(3)FXC0.EXE        ：  構文解析部
                      コード最適化部（グローバル）
                      コード生成部

(4)FXC1.EXE        ：  コード最適化部（ローカル）


次に、コンパイラの各フェーズについて説明します。


■４．１  プリプロセッサ部

Ｃソースファイル中に記述されている、指定インクルードファイルの展開やマクロの置
換、プリプロセッサ命令の解析等を行い、構文解析のために必要な情報を、プリプロセ
ッサファイル（.p）として出力します。

又、その時にマクロに誤りがないか等、プリプロセッサレベルで検出できるエラーチェ
ックも行います。


■４．２  構文解析部

プリプロセッサ部により出力されたプリプロセッサファイルを読み込み、文法チェック
を行います。文法に誤りや警告が必要なものがあった時は、逐次それに対応するメッセ
ージを出力し、コード生成の為に必要な情報を作成します。その時、処理は中断せず、
プリプロセッサファイルを読み終えるまで処理は続けられます。


■４．３  コード最適化部（グローバル）

構文解析部により作成された情報を参照し、Ｃの式レベルでのグローバルな最適化を行
ないます。（情報を変換、編集）

処理終了後は、編集した情報をコード生成部に渡しコード生成処理を行います。


■４．４  コード生成部

構文解析部により作成された情報を参照し、コード最適化部（ローカル：fxc1）用の中
間ファイルを出力します。


■４．５  コード最適化部（ローカル）

コード生成部により出力された中間ファイルを読み込み、アセンブラコードレベルでの
ローカルな最適化（短い命令に変換、レジスタのロード、ストアを少なくする等）を、
行ないます。

その他に、ブランチ命令関係、パイプラインの最適化も行います。

パイプラインの最適化以外は、スイッチの指定がなくても実行されます。（デフォルト
オプティマイズ）


■４．６  処理の流れ

      ＣＣドライバ(FXCC.EXE)
          ｜
          ＋－  プリプロセッサ部 (FXCP.EXE)      test.c
          ｜                                     test.p
          ｜＋－構文解析部
          ｜｜
          ＋＋－コード生成部
          ｜｜
          ｜＋－コード最適化部（グローバル）
          ｜    (FXC0.EXE)                       test.1  [test.2]（-g 指定時）
          ｜
          ＋－  コード最適化部（ローカル）
          ｜    (FXC1.EXE)                       test.s
          ｜
          ＋－  アセンブル部 (FXAS.EXE)          test.o
          ｜
          ＋－  リンク部 (FXLK.EXE)              test.ex

＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝

第５章  レジスタの用途

－－－－－＋－－－－－－－－－－－－－－－＋－－－－－－－－－－－－－－－－－
zero      ｜ゼロ・レジスタ                ｜常に０の値を保持
－－－－－＋－－－－－－－－－－－－－－－＋－－－－－－－－－－－－－－－－－
at        ｜アセンブラ予約レジスタ        ｜アセンブラにおける命令展開時に使用
－－－－－＋－－－－－－－－－－－－－－－＋－－－－－－－－－－－－－－－－－
hsp       ｜ハンドラ・スタック・ポインタ  ｜現在未使用
－－－－－＋－－－－－－－－－－－－－－－＋－－－－－－－－－－－－－－－－－
sp        ｜スタック・ポインタ            ｜スタックフレームのアドレスを保持
－－－－－＋－－－－－－－－－－－－－－－＋－－－－－－－－－－－－－－－－－
gp        ｜グローバル・ポインタ          ｜near シンボルをアクセスする際のベ
          ｜                              ｜ースアドレスを設定
－－－－－＋－－－－－－－－－－－－－－－＋－－－－－－－－－－－－－－－－－
tp        ｜テキスト・ポインタ            ｜現在未使用
－－－－－＋－－－－－－－－－－－－－－－＋－－－－－－－－－－－－－－－－－
ra0～ra3  ｜関数引数レジスタ              ｜関数の引数受け渡しに使用
－－－－－＋－－－－－－－－－－－－－－－＋－－－－－－－－－－－－－－－－－
rg0～rg9  ｜作業用レジスタ                ｜演算時の作業用に使用（rg0は関数の
          ｜                              ｜戻り値が設定）
－－－－－＋－－－－－－－－－－－－－－－＋－－－－－－－－－－－－－－－－－
rs0～rs9  ｜レジスタ変数用レジスタ        ｜レジスタ宣言したシンボルに使用
－－－－－＋－－－－－－－－－－－－－－－＋－－－－－－－－－－－－－－－－－
ut        ｜命令用作業レジスタ            ｜割り算の余りが設定
－－－－－＋－－－－－－－－－－－－－－－＋－－－－－－－－－－－－－－－－－
link      ｜リンクレジスタ                ｜関数の戻り先アドレスが設定
－－－－－＋－－－－－－－－－－－－－－－＋－－－－－－－－－－－－－－－－－

注）  rs6－utはビットストリング命令を使用するときに予約されています。

＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝

第６章  言語仕様


■６．１  プリプロセッサ命令

以下に示すマクロの定義等の各種の命令が用意されています。

１）マクロ定義
#define マクロ名 [トークン]

#define マクロ名(引数,引数,...) トークン
#undef  マクロ名

２）ソーステキストの挿入（ファイルの展開）

#include <ファイル名> or "ファイル名"

３）条件付コンパイル
#if 式

#ifdef マクロ名

#ifndef マクロ名
#else
#endif
#elif 式

４）その他の制御命令

#line 定数 ["ファイル名"]

#error エラ－メッセージ

#pragma

#asm

#endasm

＋－－－－－－  #pragma について  －－－－－－－－－－－－－－－－－－－－－＋
｜                                                                          ｜
｜コンパイラ依存の特殊命令として                                            ｜
｜    #pragma align(??)                                                     ｜
｜    #pragma optimize( ?? -? )                                             ｜
｜    #pragma defseg( -? , ?? )                                             ｜
｜    #pragma seg(??)                                                       ｜
｜をサポートしています。                                                    ｜
｜                                                                          ｜
｜                                                                          ｜
｜○ 関数の実体のアラインメント                                             ｜
｜                                                                          ｜
｜《記述方法》                                                              ｜
｜    #pragma align ( アラインメントサイズ )                                ｜
｜                                                                          ｜
｜    記述行より後で定義されている関数で、一番始めに発見されるもののみを    ｜
｜    補正します。                                                          ｜
｜                                                                          ｜
｜      #pragma align ( 8 )      →１０進数                                 ｜
｜      #pragma align ( 0x10 )   →１６進数                                 ｜
｜      #pragma align ( 04 )     → ８ 進数                                 ｜
｜                                                                          ｜
｜      注）８進数で指定する時は先頭に０を付ける事を忘れないで下さい。      ｜
｜                                                                          ｜
｜○ 最適化処理のコントロール                                               ｜
｜                                                                          ｜
｜《記述方法》                                                              ｜
｜    #pragma optimize ( オンオフswitch  項目switch )                       ｜
｜                                                                          ｜
｜    オンオフswitch  :                                                     ｜
｜        on        → 最適化を行なう                                       ｜
｜        off       → 最適化を行なわない                                   ｜
｜                                                                          ｜
｜    項目switch      :                                                     ｜
｜        -c        →Ｃopy propagation（式の複写伝搬）                     ｜
｜        -d        →Ｄead-code elimination（不要式の削除）                ｜
｜        -p        →Ｐipe-line optimize（パイプラインオプティマイズ）     ｜
｜        -r        →Ｒegister assignment（auto変数、関数引数のレジスタ    ｜
｜                                          割り付け）                      ｜
｜        -s        →common Ｓubexpression elimination（共通部分式の削除） ｜
｜        -v        →dead Ｖariable elimination（未使用auto・register      ｜
｜                                                変数の削除）              ｜
｜                                                                          ｜
｜有効範囲は、基本的にこれらの記述があった行より                            ｜
｜      ・ ファイルの終端に達する。                                         ｜
｜      ・ または、on/off を逆転させる記述を見つける。                      ｜
｜までですが、                                                              ｜
｜      ・ -r   /* auto変数 関数引数をレジスタに割付     */                 ｜
｜      ・ -v   /* 未使用の auto・register 変数を削除    */                 ｜
｜が、関数内に記述された時は、その関数内の変数は影響を受けます。            ｜
｜                                                                          ｜
｜注）#pragma optimize( ?? -? ) の -s・-v 以外は、-O （コンパイラ最適化     ｜
｜    オプション）指定時のみ有効                                            ｜
｜                                                                          ｜
｜＜例＞                                                                    ｜
｜                                                                          ｜
｜#pragma optimize ( off -c )  →式の複写伝搬を行なわない                   ｜
｜#pragma optimize ( off -d )  →不要式の削除を行なわない                   ｜
｜#pragma optimize ( on  -p )  →パイプラインオプティマイズを行う           ｜
｜#pragma optimize ( on  -r )  →auto変数 関数引数をレジスタに割り付る      ｜
｜#pragma optimize ( off -s )  →共通部分式の削除を行なわない               ｜
｜#pragma optimize ( on  -v )  →未使用の auto・register 変数を削除する     ｜
｜                                                                          ｜
｜                                                                          ｜
｜＜プログラム例＞                                                          ｜
｜                                                                          ｜
｜--------- sample.c ---------------                                        ｜
｜main()                                                                    ｜
｜{                                                                         ｜
｜    int a,b,c;                                                            ｜
｜    a = 1;                                                                ｜
｜#pragma optimize (off -d)    →この行以降は不要式の削除を行なわない       ｜
｜    b = 2;                                                                ｜
｜#pragma optimize (on -d )    →不要式の削除を再開する                     ｜
｜    c = 3;                                                                ｜
｜}                                                                         ｜
｜------                                                                    ｜
｜% fxcc -S -O sample.c                                                     ｜
｜--------- sample.s --------------- ＊                                     ｜
｜#                                                                         ｜
｜    file    "sample.c"                                                    ｜
｜    seg     cseg                                                          ｜
｜#                                                                         ｜
｜    globl   main                                                          ｜
｜    seg     cseg                                                          ｜
｜main:                                                                     ｜
｜    add     #$fffffffc, sp                                                ｜
｜# line 7                                                                  ｜
｜    mov     #$2, rg0         →上記指定によりb = 2;の式は削除されていない ｜
｜    st.w    rg0, $0(sp)                                                   ｜
｜    add     #$4, sp                                                       ｜
｜    rts                                                                   ｜
｜#                                                                         ｜
｜    seg     cseg                                                          ｜
｜-------                                                                   ｜
｜                                                                          ｜
｜○ セグメントの定義                                                       ｜
｜                                                                          ｜
｜《記述方法》                                                              ｜
｜    #pragma defseg (  項目switch , セグメント名 )                         ｜
｜                                                                          ｜
｜    項目switch    :                                                       ｜
｜      -C          →コードセグメントの指定                                ｜
｜      -D          →データセグメントの指定                                ｜
｜      -B          →ＢＳＳセグメントの指定                                ｜
｜      -d          →ＧＰ相対データセグメントの指定                        ｜
｜      -b          →ＧＰ相対ＢＳＳセグメントの指定                        ｜
｜      -Z          →ゼロページセグメントの指定                            ｜
｜                                                                          ｜
｜    セグメント名  :                                                       ｜
｜      ????        → ユーザー定義のセグメント名を記述                     ｜
｜＜例＞                                                                    ｜
｜                                                                          ｜
｜#pragma defseg(-C,Text)    →Ｔｅｘｔ   を定義                            ｜
｜#pragma defseg(-D,Data)    →Ｄａｔａ   を定義                            ｜
｜#pragma defseg(-B,Bss)     →Ｂｓｓ     を定義                            ｜
｜#pragma defseg(-d,Gdata)   →Ｇｄａｔａ を定義                            ｜
｜#pragma defseg(-b,Gbss)    →Ｇｂｓｓ   を定義                            ｜
｜#pragma defseg(-Z,Zero)    →Ｚｅｒｏ   を定義                            ｜
｜                                                                          ｜
｜                                                                          ｜
｜○ セグメントの切替え                                                     ｜
｜                                                                          ｜
｜《記述方法》                                                              ｜
｜    #pragma seg ( セグメント名 )                                          ｜
｜                                                                          ｜
｜    セグメント名    :                                                     ｜
｜      ????          →ユーザー定義のセグメント名への切替え                ｜
｜      cseg          →デフォルトのコードセグメントへ切替え                ｜
｜      dseg          →デフォルトのデータセグメントへ切替え                ｜
｜      bseg          →デフォルトのＢＳＳセグメントへ切替え                ｜
｜      gdseg         →デフォルトのＧＰ相対データセグメントへ切替え        ｜
｜      gbseg         →デフォルトのＧＰ相対ＢＳＳセグメントへ切替え        ｜
｜      zseg          →デフォルトのゼロページセグメントへ切替え            ｜
｜                                                                          ｜
｜＜例＞                                                                    ｜
｜                                                                          ｜
｜#pragma seg(Text)     →Ｔｅｘｔ   への切替え                             ｜
｜#pragma seg(Data)     →Ｄａｔａ   への切替え                             ｜
｜#pragma seg(Bss)      →Ｂｓｓ     への切替え                             ｜
｜#pragma seg(Gdata)    →Ｇｄａｔａ への切替え                             ｜
｜#pragma seg(Gbss)     →Ｇｂｓｓ   への切替え                             ｜
｜#pragma seg(Zero)     →Ｚｅｒｏ   への切替え                             ｜
｜                                                                          ｜
｜＜プログラム例＞                                                          ｜
｜                                                                          ｜
｜--------- sample.c ---------------                                        ｜
｜                                                                          ｜
｜#pragma defseg(-C,Text)  →コード属性の Text という名前のセグメントを定義 ｜
｜#pragma defseg(-D,Data)  →データ属性の Data という名前のセグメントを定義 ｜
｜#pragma defseg(-B,Bss)   →ＢＳＳ属性の Bss という名前のセグメントを定義  ｜
｜#pragma defseg(-d,Gdata) →ＧＰ相対データ属性のGdataという名前のセグメント｜
｜                           を定義                                         ｜
｜#pragma defseg(-b,Gbss)  →ＧＰ相対ＢＳＳ属性の Gbss という名前のセグメン ｜
｜                           トを定義                                       ｜
｜#pragma defseg(-Z,Zero)  →ゼロページ属性のZeroという名前のセグメントを   ｜
｜                           定義                                           ｜
｜                                                                          ｜
｜#pragma seg(Text)        →コードセグメント名を Text に切替え             ｜
｜#pragma seg(Data)        →データセグメント名を Data に切替え             ｜
｜#pragma seg(Bss)         →ＢＳＳセグメント名を Bss に切替え              ｜
｜#pragma seg(Gdata)       →ＧＰ相対データセグメント名を Gdata に切替え    ｜
｜#pragma seg(Gbss)        →ＧＰ相対ＢＳＳセグメント名を Gbss に切替え     ｜
｜#pragma seg(Zero)        →ゼロページセグメント名を Zero に切替え         ｜
｜                                                                          ｜
｜int    Ea = 1;           →Data に割り付け                                ｜
｜int    Eb;               →Bss に割り付け                                 ｜
｜zero int    Eza;         →Zero に割り付け                                ｜
｜near int    Ena = 1;     →Gdata に割り付け                               ｜
｜near int    Enb;         →Gbss に割り付け                                ｜
｜void  foo()              →Text に割り付け                                ｜
｜{                                                                         ｜
｜}                                                                         ｜
｜                                                                          ｜
｜#pragma seg(cseg)        →コードセグメント名を 通常名に切替え            ｜
｜#pragma seg(dseg)        →データセグメント名を 通常名に切替え            ｜
｜#pragma seg(bseg)        →ＢＳＳセグメント名を 通常名に切替え            ｜
｜#pragma seg(gdseg)       →ＧＰ相対データセグメント名を 通常名に切替え    ｜
｜#pragma seg(gbseg)       →ＧＰ相対ＢＳＳセグメント名を 通常名に切替え    ｜
｜#pragma seg(zseg)        →ゼロページセグメント名を 通常名に切替え        ｜
｜                                                                          ｜
｜int    Ea1 = 1;          →dseg に割り付け                                ｜
｜int    Eb1;              →bseg に割り付け                                ｜
｜zero int    Eza1;        →zseg に割り付け                                ｜
｜near int    Ena1 = 1;    →gdseg に割り付け                               ｜
｜near int    Enb1;        →gbseg に割り付け                               ｜
｜void  foo1()             →cseg に割り付け                                ｜
｜{                                                                         ｜
｜}                                                                         ｜
｜------                                                                    ｜
｜% fxcc -S sample.c                                                        ｜
｜--------- sample.s --------------- ＊                                     ｜
｜#                                                                         ｜
｜defseg    Text,"text"                                                     ｜
｜defseg    Data,"data"                                                     ｜
｜    defseg    Bss,"bss"                                                   ｜
｜    defseg    Gdata,"data,offset"                                         ｜
｜    defseg    Gbss,"bss,offset"                                           ｜
｜    defseg    Zero,"bss,zero"                                             ｜
｜    file      "sample.c"                                                  ｜
｜    seg       Data                                                        ｜
｜    globl     Ea                                                          ｜
｜Ea:                                                                       ｜
｜    dw        $1                                                          ｜
｜    seg       Gdata                                                       ｜
｜    globl     Ena                                                         ｜
｜Ena:                                                                      ｜
｜    dw       $1                                                           ｜
｜    seg      dseg                                                         ｜
｜    globl    Ea1                                                          ｜
｜Ea1:                                                                      ｜
｜    dw       $1                                                           ｜
｜    seg      gdseg                                                        ｜
｜    globl    Ena1                                                         ｜
｜Ena1:                                                                     ｜
｜    dw       $1                                                           ｜
｜    seg      Gbss                                                         ｜
｜    globl    Enb                                                          ｜
｜Enb:                                                                      ｜
｜    ds       $4                                                           ｜
｜    seg      gbseg                                                        ｜
｜    globl    Enb1                                                         ｜
｜Enb1:                                                                     ｜
｜    ds       $4                                                           ｜
｜    seg      Bss                                                          ｜
｜    globl    Eb                                                           ｜
｜Eb:                                                                       ｜
｜    ds       $4                                                           ｜
｜    seg      bseg                                                         ｜
｜    globl    Eb1                                                          ｜
｜Eb1:                                                                      ｜
｜    ds       $4                                                           ｜
｜    seg      Zero                                                         ｜
｜    zextern  Eza                                                          ｜
｜Eza:                                                                      ｜
｜    ds       $4                                                           ｜
｜    seg      zseg                                                         ｜
｜    zextern  Eza1                                                         ｜
｜Eza1:                                                                     ｜
｜    ds       $4                                                           ｜
｜#                                                                         ｜
｜    globl    foo                                                          ｜
｜    seg      Text                                                         ｜
｜foo:                                                                      ｜
｜    rts                                                                   ｜
｜    #                                                                     ｜
｜    globl    foo1                                                         ｜
｜    seg      cseg                                                         ｜
｜foo1:                                                                     ｜
｜    rts                                                                   ｜
｜#                                                                         ｜
｜    seg      cseg                                                         ｜
｜                                                                          ｜
＋－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－＋


＋－－－－－－#asm, #endasmについて －－－－－－－－－－－－－－－－－－－－＋
｜                                                                          ｜
｜Ｃのプログラム中に、直接アセンブラコードを表記します。                    ｜
｜《記述方法》                                                              ｜
｜    #asm                                                                  ｜
｜    ：                                                                    ｜
｜    ：                                                                    ｜
｜    アセンブラコード                                                      ｜
｜    #endasm                                                               ｜
｜#asm文の次の行から、#endasm文までを何も編集せずにアセンブラソースコード   ｜
｜として出力します。                                                        ｜
｜                                                                          ｜
｜＜例＞                                                                    ｜
｜--------- adp_data.c ---------------                                      ｜
｜#asm                                                                      ｜
｜    seg   dseg                                                            ｜
｜    align $4                                                              ｜
｜adp_data::                                                                ｜
｜    binload "SAMPLE.ADP",0x2c                                             ｜
｜#endasm                                                                   ｜
｜                                                                          ｜
｜※ binload "ファイル名"［,オフセット［,バイト数］］                       ｜
＋－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－＋

■６．２  データの種類

データの種類は、記憶クラス指定子と型指定子によって様々に定義することができます
。
１）記憶クラス指定子

auto、register、static、extern、typedef

上記は、従来のＣの言語仕様どうりですが、本コンパイラでは、その他に interrupt, z
ero, near, far という記憶クラス修飾子を用意しています。

《interrupt》
インタラプト型の関数を定義する時に使用します。（関数型以外はエラーです）

通常、関数の終了は rts 命令で生成されますが、これを指定すると reti 命令で生成し
ます。レジスタのセーブ（『６．４．３  レジスタのセーブ指定』参照）等、割り込み
に必要な処理は、ユーザーが行わなければいけません。

《zero》
シンボルが、zeroレジスタ相対シンボルであることを意味します。
zeroレジスタ相対シンボルは、zeroレジスタ ＋ 符号付16ビットオフセットでアクセス
します。（『６．４  特殊仕様』参照）

《near》
シンボルが、ＧＰレジスタ相対シンボルであることを意味します。
ＧＰレジスタ相対シンボルは、ＧＰレジスタ ＋ 符号付16ビットオフセットでアクセス
します。（『６．４  特殊仕様』参照）

《far》
シンボルが、32ビット絶対シンボルであることを意味します。
シンボルロード時に３２ビットでアクセスします。３２ビットでアクセスするシンボル
を 明示的に宣言する場合に使用します。（『６．４  特殊仕様』参照）

２）型指定子

void、char、short、int、long、float

double **

signed、unsigned、struct、union、enum

const、volatile

typedefで宣言したシンボル

    ** 現在サポートしていません。


■６．３  型変換

代入、演算、比較式の両辺の型が異なっている時は、型変換が発生します。

変換方法はＡＮＳＩ規格に準拠しており、演算、比較は常に int に変換して行ない、
代入は、代入される側の型にあわせて変換します。


■６．４  特殊仕様

◆６．４．１  レジスタ使用制限（使用禁止）の指定

指定されたレジスタを使用しないで、コード生成を行ないます。

《指定方法》
regmsk レジスタ;

指定できるレジスタは、作業用レジスタとレジスタ変数用レジスタのみです。
    ・ＮＥＣレジスタ表記も使用できます。

作業用レジスタ          ：    rg1 ～ rg9    ：  r11 ～ r19
レジスタ変数用レジスタ  ：    rs0 ～ rs9    ：  r20 ～ r29

regmsk rs2;                → rs2 を 使用禁止
regmsk rs2, rg1, rg2;      → rs2, rg1, rg2 を 使用禁止
regmsk rs2-rs6;            → rs2, rs3, rs4, rs5, rs6 を 使用禁止

  ', ' と '-' は 混在可能です。また、指定するレジスタ名は小文字のみ有効です。

regmsk rg2, rg5-rg7, rg9, rs1;

また、regmsk は変数の宣言と同じような扱いになり、各ブロック毎に指定できます。
（式の途中などには指定できません。）

＜例＞
test.c

regmsk rs0-rs2;  → このファイル内では、rs0からrs2は使用禁止

void fnc(int arg)
{
    regmsk rg2;             →この関数内では、rs0からrs2, rg2は使用禁止
    if ( arg ) {
        regmsk rg3,rg6;     → このブロック内では、rs0からrs2, rg2, rg3, rg6 は
                               使用禁止
    }
}

以下のレジスタは指定できません。（無視します）

－－－－－＋－－－－－－－－－－－－－－－－－
zero      ｜ゼロレジスタ
at        ｜アセンブラリザーブ
hsp       ｜ハンドラスタックポインタ
sp        ｜スタックポインタ
gp        ｜gpレジスタ
ra0 - ra3 ｜関数引数
rg0       ｜関数リターンヴァリューレジスタ
ut        ｜特殊演算レジスタ
link      ｜リンクレジスタ
－－－－－＋－－－－－－－－－－－－－－－－－

◆６．４．２  変数のレジスタ割り付け

任意のレジスタを変数として使用できます。

《指定方法》

int a:rg8;

register int a:rg8;
・このケースでは、レジスタ変数用レジスタを使用せずにrg8 を割り付けます。

int a:rg8,b:rg8;
・重複エラーになります。
・指定するレジスタ名は小文字のみ有効です。

＜例＞
foo()
{
    int a:rg8;

    a = 0;
}                    → a を rg8 として処理します。

・int a:rg8; のような 拡張レジスタ表記では、全てのケースにおいて 記憶クラスがre
gisterとなります。

＜例＞
bar()
{
    extern int a:rg8;   → register int a:rg8;
    static int b:rg1;   → register int b:rg1;
    int c:rg2;          → register int c:rg2;
}

    int e:rg3;          → register int e:rg3;    → error

・外部リンケージを持つ レジスタ宣言したことになるのでエラーになります。


◆６．４．３  レジスタのセーブ指定

任意のレジスタを関数の始まり、又はブロックの始まりでセーブします。（関数、ブロ
ックの終りで元に戻します）

《指定方法》

regsave レジスタ;

レジスタの指定方法は、regmsk と同様です。

・regsave は、ブロック（関数）内のみ有効で、グローバルなスコープに宣言した時は
、エラーになります。

・指定するレジスタ名は小文字のみ有効です。


◆６．４．４  レジスタの直接表記

以下のレジスタを、Ｃのプログラム中に直接表記できます。

《汎用レジスタ》

－－－－－－－－－－－－＋－－－－－－－－－－－
当システム表記          ｜ ＮＥＣ表記
－－－－－＋－－－－－－＋－－－－－＋－－－－－
zero      ｜_ZERO       ｜r0        ｜_R0
at        ｜_AT         ｜r1        ｜_R1
hsp       ｜_HSP        ｜r2        ｜_R2
sp        ｜_SP         ｜r3        ｜_R3
gp        ｜_GP         ｜r4        ｜_R4
tp        ｜_TP         ｜r5        ｜_R5
ra0～ra3  ｜_RA0～_RA3  ｜r6～r9    ｜_R6～_R9
rg0～rg9  ｜_RG0～_RG9  ｜r10～r19  ｜_R10～_R19
rs0～rs9  ｜_RS0～_ RS9 ｜r20～r29  ｜_R20～_R29
ut        ｜_UT         ｜r30       ｜R30
link      ｜_LINK       ｜r31       ｜R31
－－－－－＋－－－－－－＋－－－－－＋－－－－－


《特殊レジスタ》
eipc   :   _EIPC
eipsw  :   _EIPSW
fepc   :   _FEPC
fepsw  :   _FEPSW
ecr    :   _ECR
psw    :   _PSW
pir    :   _PIR
tkcw   :   _TKCW
chcw   :   _CHCW
adtre  :   _ADTRE


◆６．４．５  Ｉ／Ｏポートアクセスの表記

ＣのプログラムからＩ／Ｏポートをアクセスする為の表記として、特殊な関数呼び出し
があります。

－－－＋－－－－－－－－－－－－－＋－－－－－－－－－－－
      ｜表記方法                  ｜生成コード
－－－＋－－－－－－－－－－－－－＋－－－－－－－－－－－
入力  ｜__INPORTB(value)          ｜in.b value(zero), reg
      ｜__INPORTH(value)          ｜in.h value(zero), reg
      ｜__INPORTW(value)          ｜in.w value(zero), reg
－－－＋－－－－－－－－－－－－－＋－－－－－－－－－－－
出力  ｜__OUTPORTB(value, data)   ｜data → reg
      ｜                          ｜out.b reg,value(zero)
      ｜__OUTPORTH(value, data)   ｜data → reg
      ｜                          ｜out.h reg,value(zero)
      ｜__OUTPORTW(value,data)    ｜data → reg
      ｜                          ｜out.w reg,value(zero)
－－－＋－－－－－－－－－－－－－＋－－－－－－－－－－－

これらの関数名は予約語として登録されているので、同名の変数名、関数名を宣言して
はいけません。


◆６．４．６  interrupt 型関数

interrupt 拡張キーワードを使用することにより、割り込みハンドラルーチンを記述す
ることができます。interrupt関数は、値を返さない（void の）関数型として宣言する
必要があり、リターン命令として rts ではなく reti でコード生成します。なお、レ
ジスタの退避・復帰は regsave を使ってユーザーが行わなければいけません。

《記述方法》

void    interrupt    関数名()
{
    関数本体
}

◆６．４．７  zero 記憶クラス修飾子

zero 拡張キーワードは、zeroレジスタ相対シンボルを宣言する場合に使用します。
zeroレジスタ相対シンボルとは、メモリアクセスの際にzeroレジスタからのオフセット
によりロード（ストア）されます。

《記述方法》

記憶クラス指定子  zero  型指定子  シンボル名;

＜例＞
---- ok.c ------------
zero int          Eza;
static zero int   Ezb;
extern zero int   Ezc;
void    foo()
{
    static zero int   za;
    extern zero int   zb;
    zb = Eza;
}
---- ok.s ------------ ＊
#
    file    "ok.c"
    seg     zseg
@L2:
    ds      $4
    zglobl  Ezc       →外部参照のゼロページシンボル
    zglobl  zb        →外部参照のゼロページシンボル
    seg     zseg
    globl   Eza
Eza:                  →ゼロページシンボルなので zseg に割り付けられる
    ds      $4
Ezb:                  →ゼロページシンボルなので zseg に割り付けられる
    ds      $4
    align   $4
#
    globl   foo
    seg     cseg
foo:
# line 10
    ld.w    Eza(zero),rg0   →zero レジスタ相対でアクセス
    st.w    rg0,zb(zero)    →zero レジスタ相対でアクセス
    rts
#
    seg     cseg

---- err.c -----------
zero int    Ezx = 1;     →初期化はエラー
zero void   bar()        →関数に使用するとエラー
{
    zero int    zx;      →関数内で外部リンケージを持つゼロページ
                           シンボルを定義すると、エラー
}

◆６．４．８  near 記憶クラス修飾子

near 拡張キーワードは、ＧＰレジスタ相対シンボルを宣言する場合に使用します。
ＧＰレジスタ相対シンボルとは、メモリアクセスの際にgpレジスタからのオフセットに
よりロード（ストア）されます。


《記述方法》

記憶クラス指定子  near  型指定子  シンボル名;

＜例＞
---- ok.c ------------
near int          Ena;
static near int   Enb;
extern near int   Enc;
void    foo()
{
    static near int   na;
    extern near int   nb;
    nb = Ena;
}
---- ok.s ------------ ＊
#
    file        "ok.c"
    seg         gbseg
@L2:
    ds          $4
    zglobl[gp]  Enc         →外部参照のＧＰ相対シンボル
    zglobl[gp]  nb          →外部参照のＧＰ相対シンボル
    seg         gbseg
    align       $4
    globl       Ena
Ena:                       →ＧＰ相対のBSSシンボルなので gbseg に割り付けられる
    ds          $4
Enb:                       →ＧＰ相対のBSSシンボルなので gbseg に割り付けられる
    ds          $4
    align       $4
#
    globl       foo
    seg         cseg
foo:
# line 10
    ld.w        Ena(gp),rg0 →ＧＰレジスタ相対でアクセス
    st.w        rg0,nb(gp)  →ＧＰレジスタ相対でアクセス
    rts
#
    seg         cseg
---- err.c -----------
near void    bar()          →関数に使用するとエラー
{
    near    int    nx;      →関数内で外部リンケージを持つＧＰ相対
                              シンボルを定義すると、エラー
}

◆６．４．９  far 記憶クラス修飾子

far 拡張キーワードは、-x  スイッチ（デフォルトでグローバル変数をＧＰ相対シンボ
ルとするスイッチ）指定時に、明示的に32ビット絶対アドレスシンボルを宣言する場合
に使用します。

《記述方法》

記憶クラス指定子  far  型指定子  シンボル名;

＜例＞
---- ok.c ------------
far int E1;
int     E2;

void    foo()
{
    E1 = 0;
    E2 = 0;
}
----------------------
% fxcc -x -S ok.c
---- ok.s ------------ ＊
#
    file    "z.c"
    seg     bseg
    align   $4
    globl   E1
E1:                     →  far 宣言をしているので、３２ビットシンボルになる
    ds      $4
    seg     gbseg
    align   $4
    globl   E2
E2:                     →  -x スイッチを指定しているのでＧＰ相対になる
    ds      $4
#
    globl   foo
    seg     cseg
foo:
# line 6
    movhi   #hi1(E1),zero,rg1   →  32 ビットシンボルとしてアクセス
    st.w    zero,lo(E1)(rg1)
# line 7
    st.w    zero,E2(gp)         →  ＧＰレジスタ相対アドレス
#
    rts
#
    seg    cseg
---- err.c -----------
far void    bar()               →  関数に使用するとエラー
{
    far    int    fx;           →  関数内で外部リンケージを持つシンボルを定義
                                    すると、エラー
}

◆６．４．１０  near属性（ＧＰレジスタ相対）シンボルについて

本コンパイラでは、拡張キーワードnearを使用することにより、ＧＰレジスタ相対シン
ボルを使用することができます。システムの構成上near属性の変数は、通常、初期化の
あるものは使用しませんのでgbsegというセグメントに割り付けられます。
レジスタ相対でメモリをアクセスする場合、ディスプレースメントは16bitなのでＧＰレ
ジスタ相対でアクセスできる領域はgpで示されるアドレスから-32768～+32767の範囲に
なります。near属性で宣言された変数は、この範囲に収まらなければなりません。
（near変数領域の合計は64Kバイトを越えてはいけません。）

●gpレジスタの初期値について
明示的なセグメントの指定がない場合、本コンパイラはnearを使用して宣言された初期
化のないシンボルをgbsegに割り当てますが、これらのシンボルが正常にアクセスされる
ようにするには、通常_Sgbsegの値をスタートアップルーチンなどで設定します。（_STA
RTUP.O内で設定してあります）

＜例＞
---- _start.s ----------- ＊
          .
          .
          .
    mov.w   #_Sgbseg
          .
          .
          .
    jmp     main
-------------------------

●変数の宣言方法について
near記憶クラス修飾子は、関数の外で宣言される外部変数、関数内外のextern変数・sta
tic変数のみに使用が可能です。具体的な宣言方法は、以下の例を参照してください。

＜例＞
---- main.c -----------
extern          char    foo1;
extern          cher    foo2;

        near    long    Data;
extern  near    char    bar1;
static  near    int     Flg;

main()
{
    extern    near  char    bar2;
    static    near  short   Test;

    foo2 = foo1;
    bar2 = bar1;
    Test = 0;
    Data = Flg;
}
-------------------------

●参照されるアドレスについて
アドレス参照時に使用されるシンボルの値は、通常の外部シンボルの場合にはそのシン
ボルの属するセグメントの先頭アドレス（_Sbseg等）にオフセットを加えたものになり
ますが、nearシンボルの場合は、レジスタ相対で使用する都合上、そのセグメントの先
頭アドレス（_Sgbseg等）からのオフセット値がシンボルの値になります。

通常外部シンボル                      nearシンボル
---- foo.c -----------                ---- bar.c -----------
char foo1;                            near char bar1;
char foo2;                            near char bar2;

---- foo.s -----------                ---- bar.s -----------
         seg      bseg                         seg      gbseg
         globl    foo1                         globl    bar1
foo1:                                 bar1:
         ds       $1                           ds       $1
         globl    foo2                         globl    bar2
foo2:                                 bar2:
         ds       $1                           ds       $1


  ｜            ｜                          ｜            ｜
  ｜            ｜                    -32768＋－－－－－－＋＋－本来の
  ｜            ｜  _Sbseg                  ｜    bar1    ｜｜  _Sgbseg
+0＋－－－－－－＋←($9000)           -32767＋－－－－－－＋｜   ($10000)
  ｜    foo1    ｜                          ｜    bar2    ｜｜
+1＋－－－－－－＋                    -32766＋－－－－－－＋｜
  ｜    foo2    ｜                          ｜      .     ｜+32768($8000)
  ＋－－－－－－＋                          ｜      .     ｜｜
  ｜      .     ｜                          ｜      .     ｜｜
  ｜      .     ｜                         0＋－－－－－－＋＋－実際の
  ｜      .     ｜                          ｜            ｜    _Sgbseg
  ｜            ｜                          ｜            ｜     ($18000)

仮にbsegが$9000、gbsegが$10000から始まるようにした場合

－－－－－－－－－－－－－－－        －－－－－－－－－－－－－－－－－
  シンボル名       値                   シンボル名       値
－－－－－－－－－－－－－－－        －－－－－－－－－－－－－－－－－
    _Sbseg       $9000                    _Sgbseg      $18000
－－－－－－－－－－－－－－－        －－－－－－－－－－－－－－－－－
     foo1        $9000                     bar1        $8000(-32768)
－－－－－－－－－－－－－－－        －－－－－－－－－－－－－－－－－
     foo2        $9001                     bar2        $8001(-32767)
－－－－－－－－－－－－－－－        －－－－－－－－－－－－－－－－－
となります。

注）  _Sbseg,_Sgbseg等のシンボルはリンカが作成する特殊シンボルです。
これらは、通常そのセグメントの先頭アドレスを指すシンボルですが、near属性を持つ
セグメントの場合はレジスタ相対で使用する都合上特別扱いし、本来のアドレスに
+32768($8000)するようになっています。


以下は前記の_start.s main.c foo.c bar.c をコンパイル・アセンブル・リンクした場
合の概念図です。

    ｜            ｜
  +0＋－－－－－－＋←_Sbseg
    ｜    foo1    ｜
  +1＋－－－－－－＋
    ｜            ｜
    ＋－－－－－－＋
    ｜      .     ｜
    ｜      .     ｜
    ｜      .     ｜
    ｜            ｜
    ＋－－－－－－＋-32768  ←－＋－－本来の
    ｜            ｜            ｜    _Sgbseg
    ｜    Data    ｜            ｜
    ｜            ｜            ｜
    ｜            ｜            ｜         シンボル名    値
    ＋－－－－－－＋-32764      ｜
    ｜            ｜            ｜         foo1          _Sbseg+0
    ｜    Flg     ｜            ｜         foo2          _Sbseg+1
    ｜            ｜            ｜
    ｜            ｜            ｜         Data          -32768
    ＋－－－－－－＋-32760      ｜         Flg           -32764
    ｜    Test    ｜            ｜         Test(@L2)     -32760
    ｜            ｜            ｜
    ＋－－－－－－＋            ｜         bar1          -32756
    ｜  (.align)  ｜            ｜         bar2          -32755
    ｜            ｜            ｜
    ＋－－－－－－＋-32756      ｜
    ｜    bar1    ｜            ｜
    ＋－－－－－－＋-32755      ｜
    ｜    bar2    ｜            ｜
    ＋－－－－－－＋            ｜
    ｜      .     ｜            ｜
    ｜      .     ｜         +32768($8000)
    ｜      .     ｜            ｜
    ｜            ｜            ｜
gp→＋－－－－－－＋0       ←－＋－－実際の
    ｜      .     ｜                  _Sgbseg
    ｜      .     ｜
    ｜      .     ｜
    ｜            ｜


main:
# line  13
        movhi   #hi1(foo1),zero,rg1  ;
        ld.b    lo(foo1)(rg1),rg0    ;通常の外部変数
        movhi   #hi1(foo2),zero,rg2  ;
        st.b    rg0,lo(foo2)(rg2)    ;
# line  14
        ld.b    bar1(gp),rg3         ;ld.b        -32756(gp),rg3となり、
        st.b    rg3,bar2(gp)         ;目的の領域にアクセスされる
# line  15
        st.h    zero,@L2(gp)         ;関数内staticは名前が変わる
#line   16
        ld.w    Flg(gp),rg5          ;
        st.w    rg5,Data(gp)         ;
        rts

●near属性のセグメントが複数ある場合の注意
明示的に初期化したnear属性のシンボルを定義した場合などでは、near属性のセグメン
トが複数存在することになりますが、その場合それらのセグメントは連続した領域に割
り振らなければなりません。（実行時にgpレジスタを操作する場合はこの限りではない
）連続領域に割り振る場合は、リンク時に

  /gdseg + gbseg:nnnn  （nnnnはアドレス）

を指定し、gpレジスタの初期値には、連続領域の割り当て時にリンカに指定したセグメ
ントの最初のセグメントの開始アドレスを設定します。セグメントを誤ると、正常にア
クセスできませんので注意が必要です。（上記のケースでは_Sgdseg）

＜例＞
---- _start.s -----------
        .
        .
        .
    mov.w   #_Sgdseg,gp
        .
        .
        .
    jmp     main
-------------------------

また、シンボルの値はgpレジスタの初期化に使用したセグメント以外は、そのシンボル
の属するセグメントからのオフセットではなくなり、すべて最初のセグメントからのオ
フセットとなります。

＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝

第７章  Ｃコンパイラの使用書式


■７．１  コマンド入力の形式

コマンドは以下の形式で入力します。

FXCC  [スイッチ]  ファイル名  [ファイル名...]

使用法、及びスイッチの説明を表示します。


■７．２  オプションスイッチ

Ｃコンパイラの起動時に指定できるスイッチには以下のものがあります。

１）-B［ディレクトリパス名］
－－＋－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－
機能｜サブプログラムのディレクトリパスの指定
解説｜コンパイラが起動するサブプログラム（プリプロセッサやアセンブラ等）
    ｜のパスを指定出来ます。また環境変数 HBINPATH にパス名を設定した
    ｜場合も同様に動作します。
    ｜ ※ コンパイラドライバは -B オプション → HBINPATH → PATH の順に
    ｜サブプログラムを検索しますので、通常は設定する必要はありません。
省略｜サブプログラムを HBINPATH → PATH の順に検索し起動します。
－－＋－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－

２）-c[ファイル名]
－－＋－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－
機能｜リンクの抑制
解説｜このスイッチを指定することにより、コンパイラはリンカを起動せずに、オブジ
    ｜ェクトファイルを出力して終了します。
    ｜スイッチに続いてファイル名を指定すると、そのファイル名でオブジェクトファ
    ｜イルを出力し、指定されていない場合はコンパイルしたファイルと同一名で、拡
    ｜張子を “.o”にしたオブジェクトファイルが出力されます。
省略｜リンクまで実行し、実行ファイルを出力します。
－－＋－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－

３）-C
－－＋－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－
機能｜スタックチェックコードの生成
解説｜スタックチェック用の関数（名前は決められています）を呼び出すコードを生成
    ｜します。
    ｜jal  __stack_check
    ｜※この関数は、ユーザーが作成する必要があります。
    ｜__stack_checkは、それぞれの関数の中でオート変数領域の確保や、リンクレジ
    ｜スタの待避コードなどの次に呼び出されるので、__stack_check内では単に現在
    ｜のSPがスタック領域を越えているかをチェックするだけになります。
－－＋－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－

４）-Dマクロ名
－－＋－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－
機能｜マクロの定義
解説｜このスイッチを指定することにより＃ｄｅｆｉｎｅ命令と同様のマクロ定義を
    ｜行なうことができます。
省略｜ソースファイルに､＃ｄｅｆｉｎｅ命令で定義されているもののみが､有効です｡
－－＋－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－

５）-e                                                                      ＊
－－＋－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－
機能｜アセンブラソースファイルの出力（標準出力へ）
解説｜アセンブラソースファイルを標準出力へ出力します。
－－＋－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－

６）-E
－－＋－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－
機能｜プリプロセッサファイルの出力（標準出力へ）
解説｜プリプロセッサファイルで処理されたソースを標準出力へ出力します。
－－＋－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－

７）-fm
－－－－＋－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－
機能    ｜メッセージ出力先への切り替え
解説    ｜エラー・ワーニングメッセージ等の出力先を切り替えます。
-fm無し ｜stdout
-fm有り ｜stderr
－－－－＋－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－

８）-g
－－＋－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－
機能｜ソースコードデバッガ用のコード生成
解説｜このスイッチを指定することにより、ソースコードデバッガで、ソースプログラ
    ｜ムレベルでのデバッグを可能にするための、デバッグ情報を出力します。
省略｜デバッグ情報を出力しません。
－－＋－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－

９）-i size
－－＋－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－
機能｜関数実体のアラインメント
解説｜このスイッチを指定することにより、関数をsizeバイトアラインメントします。
省略｜アラインメント処理をしません。
－－＋－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－

１０）-Iパス名　　　　　　　　（このスイッチはiの大文字のIです）
－－＋－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－
機能｜インクルードパスの指定
解説｜このスイッチとそれに続くパス名を指定することによりインクルードファイルの
    ｜パスを指定、または変更できます。
    ｜インクルードパスは 環境変数 VINCLUDE でも指定できます。
省略｜環境変数に設定されているパスを検索します。
－－＋－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－

１１）-lライブラリ名　　　　　（このスイッチはLの小文字のlです）
－－＋－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－
機能｜ライブラリの指定
解説｜環境変数 VLIB で指定されるディレクトリ内の指定されたライブラリをリンク時
    ｜に使用します。
    ｜※ ライブラリ拡張子 “.a” は自動的に付加されます。
省略｜標準ライブラリ以外は使用しません。
－－＋－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－

１２）-oファイル名
－－＋－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－
機能｜出力ファイル名の指定
解説｜このスイッチと、それに続くファイル名を指定することにより指定されたファイ
    ｜ル名でファイルを出力します。-c、-P、-Sオプションを指定せず、かつ拡張子を
    ｜省略した場合はファイル名に“.ex”をつけた名前で実行形式ファイルを出力し
    ｜ます。
省略｜カレントディレクトリ上に、“a.ex”というファイル名の実行可能ファイルを出
    ｜力します。（-c、-P、-Sオプションを指定していないとき）
－－＋－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－

１３）-O
－－＋－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－
機能｜オプティマイズスイッチ
解説｜このスイッチを指定することにより、生成するコードを最適化します。（パイプ
    ｜ラインの最適化は行いません。）
省略｜生成するコードを最適化しません。
－－＋－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－

１４）-O2
－－＋－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－
機能｜パイプラインオプティマイズスイッチ
解説｜このスイッチを指定することにより、生成するコードのパイプラインを最適化し
    ｜ます。（-Oスイッチと同様の最適化も同時に行います。）
省略｜生成するコードのパイプラインを最適化しません。
－－＋－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－

１５）-P[ファイル名]
－－＋－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－
機能｜プリプロセッサファイルのみ作成
解説｜このスイッチを指定することにより、コンパイラはプリプロセッサのみ起動して
    ｜処理を終了します。
    ｜スイッチに続いてファイル名を指定すると、そのファイル名でプリプロセッサフ
    ｜ァイルを出力し、指定されていなければコンパイルしたファイルと同一名で、拡
    ｜張子を “.p”にしたプリプロセッサファイルが出力されます。
省略｜プリプロセッサ処理終了後も、コンパイルの処理は続けられます。
－－＋－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－

１６）-q
－－＋－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－
機能｜同一文字列の圧縮
解説｜このスイッチを指定することにより同一の文字列をまとめます。
省略｜同一の文字列を圧縮しません。
－－＋－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－

１７）-r                                                                    ＊
－－＋－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－
機能｜アセンブラソース出力時のレジスタ表記の変更
解説｜このスイッチを指定することにより、ＮＥＣ表記（r6～r29形式）を出力される
    ｜アセンブラファイル内のレジスタ表記として用います。
省略｜当システム表記（ra0 ～ ra3・rg0 ～ rg9 ..... 形式）をレジスタ表記として
    ｜用います。
－－＋－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－

１８）-S[ファイル名]                                                        ＊
－－＋－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－
機能｜アセンブラソースファイルのみ作成
解説｜このスイッチを指定することにより、コンパイラはアセンブラソースファイルの
    ｜み出力して終了します。
    ｜スイッチに続いてファイル名を指定すると、そのファイル名でアセンブラソース
    ｜ファイルを出力し、指定されていなければコンパイルしたファイルと同一名で、
    ｜拡張子を “.s”にしたアセンブラソースファイルが出力されます。
省略｜アセンブル、リンクまで実行し、実行可能ファイルを作成します。
    ｜アセンブラソースファイルは削除されます。
－－＋－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－

１９）-u
－－＋－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－
機能｜char を unsigned char 型 とする。
解説｜このスイッチを指定すると、常符号付きとして処理するchar を、符号なし
    ｜( unsigned char ）として処理します。
省略｜char を符合つきとして処理します。
－－＋－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－

２０）-Uマクロ名
－－＋－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－
機能｜マクロ定義の取り消し
解説｜未定義にするマクロ名を指定します。このスイッチを指定することにより、
    ｜#undef命令と同様に定義されたマクロを未定義にすることができます。
省略｜ソースファイル中に記述されている #undef 命令によるマクロ取り消しのみは有
    ｜効になります。
－－＋－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－

２１）-v
－－＋－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－
機能｜verboseモード
解説｜このスイッチを指定することにより、コンパイラの処理の流れを、標準出力に出
    ｜力します。
省略｜処理の流れを出力しません。
－－＋－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－

２２）-V
－－＋－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－
機能｜オーバーフローチェックコードの生成
解説｜整数演算（乗算、徐算、剰余算）のオーバーフローをチェックする関数（名前は
    ｜決められています）を呼び出すコードを生成します。
    ｜__mul_overflow_check      乗算
    ｜__div_overflow_check      除算、乗除算
    ｜※この関数は、ユーザーが作成する必要があります。
    ｜オーバーフローチェックコードは整数の乗算、除算命令でオーバーフローが発生
    ｜したときに呼び出されます。オーバーフローが発生したときの数値がアドレスを
    ｜検証することなどができます。
－－＋－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－

２３）-w
－－＋－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－
機能｜ワーニング出力の抑制
解説｜ワーニングメッセージを出力しません。
省略｜ワーニングメッセージを 出力します。
－－＋－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－

２４）-Wレベル
－－＋－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－
機能｜ワーニングレベルの指定
解説｜ワーニングレベルの指定をします。レベル３で最大のワーニングチェックを行な
    ｜います。
省略｜ワーニングレベルを１としてチェックを行います。
－－＋－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－

２５）-x
－－＋－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－
機能｜シンボルのアドレスロード変換
解説｜このスイッチを指定することにより、zeroやfar記憶クラス修飾子のないグロー
    ｜バル変数をＧＰ相対シンボルとします。
省略｜zeroやfar記憶クラス修飾子のないグローバル変数を常シンボルとします。
－－＋－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－

２６）-Xアドレス
－－＋－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－
機能｜プログラムの開始アドレス指定
解説｜このスイッチを指定することによりプログラムの開始アドレスを指定できます。
省略｜0x8000番地にプログラムを割つけます。
－－＋－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－

２７）-y
－－＋－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－
機能｜コモンシンボルの出力方法の切り替え
解説｜外部リンケージを持つ未初期化シンボルの出力方法を切り替えます。通常のＣコ
    ｜ンパイラでは、ファイルA・ファイルBに
    ｜    file  A                      file  B
    ｜char  buffer[128]:           char  buffer[256]:
    ｜の様な宣言をし、２つのファイルをリンクする場合、シンボルのサイズを最大の
    ｜サイズ（上記ケースではfile  Bの 256）となるようにコード生成しますが、本
    ｜コンパイラではリンク時にエラーが出るように、コード生成します。-yスイッチ
    ｜を指定することにより、通常のコンパイラと同様のコード生成を行います。
省略｜上記ケースでリンク時にエラーが出るようにします。
－－＋－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－

２８）-zCセグメント名・-zDセグメント名・-zdセグメント名
      -zBセグメント名・-zbセグメント名・-zZセグメント名
－－＋－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－
機能｜デフォルトのセグメント名の指定
解説｜ソース内で#pragma  seg(??)  によるセグメントの指定が無い場合、コードセグ
    ｜メント名、データセグメント名、GP相対データセグメント名、BSSセグメント名、
    ｜GP相対BSSデータセグメント名、ゼロページセグメント名はデフォルトとしてそ
    ｜れぞれcseg・dseg・gdseg・bseg・gbseg・zsegが使用されます。これらのセグメ
    ｜ント名の代わりにユーザー定義のセグメント名を使用する場合に、これらのスイ
    ｜ッチを使用します。
    ｜
    ｜                       スイッチ指定時                  省略時
    ｜コードセグメント       －zCで指定されたセグメント名    cseg
    ｜データセグメント       －zDで指定されたセグメント名    dseg
    ｜GP相対データセグメント －zdで指定されたセグメント名    gdseg
    ｜BSSセグメント          －zBで指定されたセグメント名    bseg
    ｜GP相対BSSセグメント    －zbで指定されたセグメント名    gbseg
    ｜ゼロページセグメント   －zZで指定されたセグメント名    zseg
－－＋－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－

２９）-AS"文字列"                                                           ＊
－－＋－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－
機能｜アセンブラへのスイッチ指定
解説｜このスイッチと、それに続く文字列中にスイッチを指定することにより、Ｃコン
    ｜パイラから、アセンブラに直接スイッチを指定できます。
    ｜・但し、Ｃコンパイラは文字列で指定したスイッチの内容はチェックしていませ
    ｜ん。コンパイラの-gスイッチ使用時にはアセンブラの-gスイッチは指定しないで
    ｜ください。
省略｜標準で指定する以下のスイッチ以外は、指定しません。
    ｜-u, -o
－－＋－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－

３０）-LK"文字列"
－－＋－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－
機能｜リンカへのスイッチ指定
解説｜このスイッチと、それに続く文字列中にスイッチを指定することにより、Ｃコン
    ｜パイラから、リンカに直接スイッチを指定できます。
    ｜・但し、Ｃコンパイラは文字列で指定したスイッチの内容はチェックしていませ
    ｜ん。
省略｜標準で指定する以下のスイッチ以外は、指定しません。
    ｜-p, -o
－－＋－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－

３１）@ファイル名
－－＋－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－
機能｜インダイレクトファイルの指定
解説｜コンパイラのスイッチをインダイレクトファイルに記述することにより指定でき
    ｜ます。
－－＋－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－

＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝

第８章  エラー・ワーニング メッセージ


■８．１  致命的なエラー（Fatal）

－－＋－－－－－－－－－－－－－＋－－－－－－－－－－－－－－－－－－－－－－
  0:｜Too many identifiers      ｜識別子の数が多すぎます。
－－＋－－－－－－－－－－－－－＋－－－－－－－－－－－－－－－－－－－－－－
  1:｜Not enough memory         ｜メモリに空きがありません。
－－＋－－－－－－－－－－－－－＋－－－－－－－－－－－－－－－－－－－－－－
  2:｜Intermediate file error   ｜中間ファイル出力時にエラーが発生しました。
－－＋－－－－－－－－－－－－－＋－－－－－－－－－－－－－－－－－－－－－－
  3:｜End of file               ｜()、{}、""、/* */などが閉じていません。
    ｜                          ｜ファイルの終わりに達しました。
－－＋－－－－－－－－－－－－－＋－－－－－－－－－－－－－－－－－－－－－－
  4:｜Target file does not exist｜指定されたファイルが存在しません。*1
－－＋－－－－－－－－－－－－－＋－－－－－－－－－－－－－－－－－－－－－－
  5:｜Register  overflow        ｜式が複雑すぎて作業用レジスタが足りなくなりま
    ｜                          ｜した。
－－＋－－－－－－－－－－－－－＋－－－－－－－－－－－－－－－－－－－－－－
  6:｜Parser stack overflow     ｜文が複雑すぎてコンパイラ内部スタックが足りな
    ｜                          ｜くなりました。
－－＋－－－－－－－－－－－－－＋－－－－－－－－－－－－－－－－－－－－－－
  7:｜Illegal use of pragma     ｜プラグマの使用法が不正です。
－－＋－－－－－－－－－－－－－＋－－－－－－－－－－－－－－－－－－－－－－
  8:｜Segment overflow          ｜セグメントの数が多過ぎます。
－－＋－－－－－－－－－－－－－＋－－－－－－－－－－－－－－－－－－－－－－
*1 コンパイル中の中間コード生成中にエラーが発生する場合があります。
   コンパイラが環境変数 TEMP を使用しているため、TEMP のパス名の指定が長すぎる
   場合、このエラーが発生する場合があります。
   その時は AUTOEXEC.BAT 又はCONFIG.SYS の環境変数 TEMP の設定を、下記の例の
   ようにパス名を短くなるように設定してください。

   例）SET C:\WINDOWS\TEMP    →   SET TEMP=C:\TEMP

   また、オプションスイッチを多く使用したときにも、このエラーが発生する場合が
   ありますので、不要なオプションスイッチはできるだけ使わないでください。
   -I オプションは 環境変数 VINCLUDE を使用して省略することができます。


■８．２  エラー （Error）

－－＋－－－－－－－－－－－－－＋－－－－－－－－－－－－－－－－－－－－－－
  0:｜Unknown character         ｜不正な文字が存在します。
－－＋－－－－－－－－－－－－－＋－－－－－－－－－－－－－－－－－－－－－－
  1:｜Illegal preprocessor #    ｜プリプロセッサで処理されなかった # 命令が
    ｜line                      ｜残っています。
－－＋－－－－－－－－－－－－－＋－－－－－－－－－－－－－－－－－－－－－－
  2:｜Comment statement error   ｜注釈文の誤りです。
－－＋－－－－－－－－－－－－－＋－－－－－－－－－－－－－－－－－－－－－－
  3:｜String is not closed      ｜文字列が閉じていません。
－－＋－－－－－－－－－－－－－＋－－－－－－－－－－－－－－－－－－－－－－
  4:｜Undefined identifier in   ｜関数内で未定義の識別子が使用されています。
    ｜function 関数名 : 識別子  ｜
－－＋－－－－－－－－－－－－－＋－－－－－－－－－－－－－－－－－－－－－－
  5:｜Number syntax error       ｜数値定数で許されない数字を使用しています。
－－＋－－－－－－－－－－－－－＋－－－－－－－－－－－－－－－－－－－－－－
  6:｜Expression error          ｜式評価の誤りです。
－－＋－－－－－－－－－－－－－＋－－－－－－－－－－－－－－－－－－－－－－
  7:｜Illegal storage class:    ｜記憶クラスの指定が不正です。
    ｜記憶クラス指定子          ｜
－－＋－－－－－－－－－－－－－＋－－－－－－－－－－－－－－－－－－－－－－
  8:｜External definition error ｜外部シンボル宣言の誤りです。
－－＋－－－－－－－－－－－－－＋－－－－－－－－－－－－－－－－－－－－－－
  9:｜Illegal use of storage    ｜宣言において記憶クラスの指定が不正です。
    ｜class : 記憶クラス指定子  ｜
－－＋－－－－－－－－－－－－－＋－－－－－－－－－－－－－－－－－－－－－－
 10:｜Identifier duplicated :   ｜識別子が重複して使用されています。
    ｜識別子                    ｜
－－＋－－－－－－－－－－－－－＋－－－－－－－－－－－－－－－－－－－－－－
 11:｜Undefined struct/union    ｜構造体／共用体の名前が未定義です。
    ｜name                      ｜
－－＋－－－－－－－－－－－－－＋－－－－－－－－－－－－－－－－－－－－－－
 12:｜Illegal type specifier    ｜不正な型指定子が指定されています。
－－＋－－－－－－－－－－－－－＋－－－－－－－－－－－－－－－－－－－－－－
 13:｜Too many initializer      ｜初期化要素が多すぎます。
－－＋－－－－－－－－－－－－－＋－－－－－－－－－－－－－－－－－－－－－－
 14:｜Declaration error         ｜宣言に誤りがあります。
－－＋－－－－－－－－－－－－－＋－－－－－－－－－－－－－－－－－－－－－－
 15:｜Identifier redeclaration  ｜識別子が再宣言されています。
－－＋－－－－－－－－－－－－－＋－－－－－－－－－－－－－－－－－－－－－－
 16:｜Storage class error at    ｜関数の記憶クラス指定に誤りがあります。
    ｜function                  ｜
－－＋－－－－－－－－－－－－－＋－－－－－－－－－－－－－－－－－－－－－－
 17:｜Break statement error     ｜break 文の誤りです。
－－＋－－－－－－－－－－－－－＋－－－－－－－－－－－－－－－－－－－－－－
 18:｜Continue statement error  ｜continue 文の誤りです。
－－＋－－－－－－－－－－－－－＋－－－－－－－－－－－－－－－－－－－－－－
 19:｜Field width overflow      ｜ビットフィールドのビット数があふれました。
－－＋－－－－－－－－－－－－－＋－－－－－－－－－－－－－－－－－－－－－－
 20:｜Field type error          ｜ビットフィールドの型に誤りがあります。
－－＋－－－－－－－－－－－－－＋－－－－－－－－－－－－－－－－－－－－－－
 21:｜Array dimension overflow  ｜配列の次元数があふれました。
－－＋－－－－－－－－－－－－－＋－－－－－－－－－－－－－－－－－－－－－－
 22:｜Element index undefined   ｜配列の要素数が指定されていません。
－－＋－－－－－－－－－－－－－＋－－－－－－－－－－－－－－－－－－－－－－
 23:｜Undefined label : ラベル  ｜未定義のラベルが使用されています。
－－＋－－－－－－－－－－－－－＋－－－－－－－－－－－－－－－－－－－－－－
 24:｜Incorrect ()              ｜() の記述に誤りがあります。
－－＋－－－－－－－－－－－－－＋－－－－－－－－－－－－－－－－－－－－－－
 25:｜Case statement error      ｜case 文の誤りです。
－－＋－－－－－－－－－－－－－＋－－－－－－－－－－－－－－－－－－－－－－
 26:｜Default statement error   ｜default 文の誤りです。
－－＋－－－－－－－－－－－－－＋－－－－－－－－－－－－－－－－－－－－－－
 27:｜Switch table overflow     ｜switch 文の case 文の数が多すぎます。
－－＋－－－－－－－－－－－－－＋－－－－－－－－－－－－－－－－－－－－－－
 28:｜Multiple default          ｜default 文が２つ以上あります。
    ｜statements                ｜
－－＋－－－－－－－－－－－－－＋－－－－－－－－－－－－－－－－－－－－－－
 29:｜Constant expression       ｜定数式である必要があります。
    ｜required                  ｜
－－＋－－－－－－－－－－－－－＋－－－－－－－－－－－－－－－－－－－－－－
 30:｜Invalid operand type      ｜演算の型が異なります。
－－＋－－－－－－－－－－－－－＋－－－－－－－－－－－－－－－－－－－－－－
 31:｜Void function             ｜戻り値無し関数なので戻り値は指定できません。
－－＋－－－－－－－－－－－－－＋－－－－－－－－－－－－－－－－－－－－－－
 32:｜Invoid expression value   ｜式の中に値を持たない項があります。
－－＋－－－－－－－－－－－－－＋－－－－－－－－－－－－－－－－－－－－－－
 33:｜Invalid parameter         ｜関数プロトタイプ宣言で不定個パラメータの宣言
    ｜declared                  ｜が誤りです。
－－＋－－－－－－－－－－－－－＋－－－－－－－－－－－－－－－－－－－－－－
 34:｜Illegal register used     ｜レジスタ宣言した識別子が、不正な使われかたを
    ｜                          ｜しています。
－－＋－－－－－－－－－－－－－＋－－－－－－－－－－－－－－－－－－－－－－
 35:｜Duplicate case value      ｜case 文の値が重複しています。
－－＋－－－－－－－－－－－－－＋－－－－－－－－－－－－－－－－－－－－－－
 36:｜Cannot initialize         ｜初期化できません。
－－＋－－－－－－－－－－－－－＋－－－－－－－－－－－－－－－－－－－－－－
 37:｜Mismatched number of      ｜仮引数の個数に誤りがあります。
    ｜parameters : 識別子       ｜
－－＋－－－－－－－－－－－－－＋－－－－－－－－－－－－－－－－－－－－－－
 38:｜Illegal structure         ｜構造体が不正な使われかたをしています。
    ｜operation                 ｜
－－＋－－－－－－－－－－－－－＋－－－－－－－－－－－－－－－－－－－－－－
 39:｜Illegal pointer conversion｜ポインタ変換が、不正に行われました。
－－＋－－－－－－－－－－－－－＋－－－－－－－－－－－－－－－－－－－－－－
 40:｜Struct reference error    ｜構造体参照に誤りがあります。
－－＋－－－－－－－－－－－－－＋－－－－－－－－－－－－－－－－－－－－－－
 41:｜Illegal member of         ｜不正な構造体メンバが使用されています。
    ｜structure :識別子         ｜
－－＋－－－－－－－－－－－－－＋－－－－－－－－－－－－－－－－－－－－－－
 42:｜Insufficient  arguments   ｜関数呼び出しで、実引数の個数が足りません。
    ｜in function call          ｜
－－＋－－－－－－－－－－－－－＋－－－－－－－－－－－－－－－－－－－－－－
 43:｜Too many argumnets        ｜関数呼び出しで、実引数の個数が多すぎます。
    ｜in function call          ｜
－－＋－－－－－－－－－－－－－＋－－－－－－－－－－－－－－－－－－－－－－
 44:｜Multiple tag names used   ｜タグ名が重複して使用されています。
－－＋－－－－－－－－－－－－－＋－－－－－－－－－－－－－－－－－－－－－－
 45:｜Invalid storage class     ｜記憶クラス指定に誤りがあります。
－－＋－－－－－－－－－－－－－＋－－－－－－－－－－－－－－－－－－－－－－
 46:｜Void typed parameter      ｜void 型の仮引数が宣言されました。
    ｜declared                  ｜
－－＋－－－－－－－－－－－－－＋－－－－－－－－－－－－－－－－－－－－－－
 47:｜Void typed identifier     ｜void 型の識別子が宣言されました。
    ｜declared                  ｜
－－＋－－－－－－－－－－－－－＋－－－－－－－－－－－－－－－－－－－－－－
 48:｜Undefinened tag name :    ｜未定義のタグ名が使用されました。
    ｜タグ名                    ｜
－－＋－－－－－－－－－－－－－＋－－－－－－－－－－－－－－－－－－－－－－
 49:｜Assigned in constant      ｜const 修飾された識別子に代入しました。
    ｜identifier                ｜
－－＋－－－－－－－－－－－－－＋－－－－－－－－－－－－－－－－－－－－－－
 50:｜Invalid indirect operator ｜式中の間接演算子の使用に誤りがあります。
－－＋－－－－－－－－－－－－－＋－－－－－－－－－－－－－－－－－－－－－－
 51:｜Invalid address operator  ｜アドレス演算子の使用に誤りがあります。
－－＋－－－－－－－－－－－－－＋－－－－－－－－－－－－－－－－－－－－－－
 52:｜Registered identifier     ｜レジスタ宣言された識別子の使用に誤りがありま
    ｜invalid                   ｜す。
－－＋－－－－－－－－－－－－－＋－－－－－－－－－－－－－－－－－－－－－－
 53:｜Function call error       ｜関数以外を呼び出しています。
－－＋－－－－－－－－－－－－－＋－－－－－－－－－－－－－－－－－－－－－－
 54:｜Left value required       ｜左辺値でなければいけません。
－－＋－－－－－－－－－－－－－＋－－－－－－－－－－－－－－－－－－－－－－
 55:｜Cannot use floating point ｜浮動小数点数値は使用できません。
－－＋－－－－－－－－－－－－－＋－－－－－－－－－－－－－－－－－－－－－－
 56:｜Illegal use of pointer    ｜ポインタが、不正な使われかたをしています。
－－＋－－－－－－－－－－－－－＋－－－－－－－－－－－－－－－－－－－－－－
 57:｜Void type error in        ｜式の中に値を持たない項があります。
    ｜expression                ｜
－－＋－－－－－－－－－－－－－＋－－－－－－－－－－－－－－－－－－－－－－
 58:｜Invalid structure type    ｜構造体代入で、構造体の型が異なっています。
－－＋－－－－－－－－－－－－－＋－－－－－－－－－－－－－－－－－－－－－－
 59:｜Parameter definition error｜関数仮引数の定義に誤りがあります。
－－＋－－－－－－－－－－－－－＋－－－－－－－－－－－－－－－－－－－－－－
 60:｜Parameter redeclared:     ｜関数仮引数が再宣言されています。
    ｜仮引数名                  ｜
－－＋－－－－－－－－－－－－－＋－－－－－－－－－－－－－－－－－－－－－－
 61:｜Invalid number of         ｜関数仮引数の個数に誤りがあります。
    ｜parameter                 ｜
－－＋－－－－－－－－－－－－－＋－－－－－－－－－－－－－－－－－－－－－－
 62:｜Constant expression error ｜定数式以外が使用されています。
－－＋－－－－－－－－－－－－－＋－－－－－－－－－－－－－－－－－－－－－－
 63:｜Illegal use of tag        ｜構造体／共用体／列挙型のタグ名が不正な使われ
    ｜                          ｜方をしています。
－－＋－－－－－－－－－－－－－＋－－－－－－－－－－－－－－－－－－－－－－
 64:｜Overflow during           ｜初期化中にオーバーフローしました。
    ｜initializing              ｜
－－＋－－－－－－－－－－－－－＋－－－－－－－－－－－－－－－－－－－－－－
 65:｜Parameter name omitted    ｜関数仮引数名を省略されました。
－－＋－－－－－－－－－－－－－＋－－－－－－－－－－－－－－－－－－－－－－
 66:｜Invalid declaration of    ｜型宣言に誤りがあります。
    ｜type                      ｜
－－＋－－－－－－－－－－－－－＋－－－－－－－－－－－－－－－－－－－－－－
 67:｜Invalid declaration of    ｜構造体・共用体の宣言に誤りがあります。
    ｜struct/union specifier    ｜
－－＋－－－－－－－－－－－－－＋－－－－－－－－－－－－－－－－－－－－－－
 68:｜Illegal use of regsave    ｜regsave が不正な使われかたをしています。
－－＋－－－－－－－－－－－－－＋－－－－－－－－－－－－－－－－－－－－－－
 69:｜Redeclaration of register ｜レジスタが再宣言されています。
    ｜: レジスタ                ｜
－－＋－－－－－－－－－－－－－＋－－－－－－－－－－－－－－－－－－－－－－
 70:｜Undefined identifier :    ｜未定義の識別子が使用されています。
    ｜識別子                    ｜
－－＋－－－－－－－－－－－－－＋－－－－－－－－－－－－－－－－－－－－－－
 71:｜Illegal use of zero       ｜zero が不正に使用されています。
－－＋－－－－－－－－－－－－－＋－－－－－－－－－－－－－－－－－－－－－－
 72:｜Segment redeclared :      ｜セグメント名が再宣言されました。
    ｜セグメント名              ｜
－－＋－－－－－－－－－－－－－＋－－－－－－－－－－－－－－－－－－－－－－
 73:｜Undefined segement :      ｜未定義のセグメント名が使用されました。
    ｜セグメント名              ｜
－－＋－－－－－－－－－－－－－＋－－－－－－－－－－－－－－－－－－－－－－
 74:｜Negative array            ｜要素数が負の配列が宣言されました。
－－＋－－－－－－－－－－－－－＋－－－－－－－－－－－－－－－－－－－－－－
 75:｜Invalid cast type         ｜キャストの使用に誤りがあります。
－－＋－－－－－－－－－－－－－＋－－－－－－－－－－－－－－－－－－－－－－
 76:｜Unknown sizeof value      ｜サイズが不明です。
－－＋－－－－－－－－－－－－－＋－－－－－－－－－－－－－－－－－－－－－－
 99:｜Syntax error              ｜文法に誤りがあります。
－－＋－－－－－－－－－－－－－＋－－－－－－－－－－－－－－－－－－－－－－


■８．３  ワーニング （Warning）

－－＋－－－－－－－－－－－－－＋－－－－－－－－－－－－－－－－－－－－－－
  0:｜Character constant        ｜文字定数が表現可能な範囲を超えています。
    ｜exceeds max area          ｜
－－＋－－－－－－－－－－－－－＋－－－－－－－－－－－－－－－－－－－－－－
  1:｜Function return value     ｜関数の返り値が異なっています。
    ｜mismatch                  ｜
－－＋－－－－－－－－－－－－－＋－－－－－－－－－－－－－－－－－－－－－－
  2:｜Argument type mismatch    ｜プロトタイプリストの型と引数の型が異なってい
    ｜                          ｜ます。
－－＋－－－－－－－－－－－－－＋－－－－－－－－－－－－－－－－－－－－－－
  3:｜Identifier too long       ｜識別子が長すぎます。
－－＋－－－－－－－－－－－－－＋－－－－－－－－－－－－－－－－－－－－－－
  4:｜Never used label          ｜一度も参照されていないラベルが定義されていま
    ｜defined : ラベル          ｜す。
－－＋－－－－－－－－－－－－－＋－－－－－－－－－－－－－－－－－－－－－－
  5:｜Parameter type mismatch   ｜引数の型が異なっています。
－－＋－－－－－－－－－－－－－＋－－－－－－－－－－－－－－－－－－－－－－
  6:｜Invalid type conversion   ｜不正な型変換です。
－－＋－－－－－－－－－－－－－＋－－－－－－－－－－－－－－－－－－－－－－
  7:｜Invalid pointer conversion｜不正なポインタ変換です。
－－＋－－－－－－－－－－－－－＋－－－－－－－－－－－－－－－－－－－－－－
  8:｜Constant in comparison    ｜比較において定数が範囲を越えています。
    ｜out of range              ｜
－－＋－－－－－－－－－－－－－＋－－－－－－－－－－－－－－－－－－－－－－
  9:｜Struct/union used for     ｜関数引数に構造体・共用体を使用しました。
    ｜function argument         ｜
－－＋－－－－－－－－－－－－－＋－－－－－－－－－－－－－－－－－－－－－－
 10:｜Implicit declaration of   ｜関数が暗黙に宣言されました。
    ｜function : 識別子         ｜
－－＋－－－－－－－－－－－－－＋－－－－－－－－－－－－－－－－－－－－－－
 11:｜Function with no prototype｜プロトタイプ宣言されていない関数が呼ばれまし
    ｜list called               ｜た。
－－＋－－－－－－－－－－－－－＋－－－－－－－－－－－－－－－－－－－－－－
 12:｜Illegal use of '...'      ｜'...' が不正に使用されました。
－－＋－－－－－－－－－－－－－＋－－－－－－－－－－－－－－－－－－－－－－
 13:｜レジスタ is reserved      ｜指定レジスタは予約されています。
    ｜register                  ｜
－－＋－－－－－－－－－－－－－＋－－－－－－－－－－－－－－－－－－－－－－
 14:｜Non void interrupt        ｜void 以外の型の interrupt 関数が宣言されまし
    ｜function declared         ｜た。
－－＋－－－－－－－－－－－－－＋－－－－－－－－－－－－－－－－－－－－－－
 15:｜Unknown size              ｜サイズが不正です。
－－＋－－－－－－－－－－－－－＋－－－－－－－－－－－－－－－－－－－－－－
 16:｜String is too long        ｜文字列が長過ぎます。
－－＋－－－－－－－－－－－－－＋－－－－－－－－－－－－－－－－－－－－－－
 17:｜Unknown pragma            ｜未サポートのプラグマが使用されました。
－－＋－－－－－－－－－－－－－＋－－－－－－－－－－－－－－－－－－－－－－

＊……アセンブラを利用する際、使用するものです。
  尚、「ＧＭＡＫＥＲ」スタータキットではアセンブラはサポートされておりません。

＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝

《著作権及び登録商標等》

・FXCC.EXE、FXCP.EXE、FXC0.EXE、FXC1.EXE、FXAS.EXE 及び FXCC.TXT（以下、"本ソ
  フトウェア"という）は、ＰＣ－ＦＸＧＡ用のソフトウェア開発ツールの一部です。
  本ソフトウェアを、ＰＣ－ＦＸ、ＰＣ－ＦＸＧＡ用のソフトウェア開発以外の目的で
  使用しないで下さい。

・本ソフトウェアを使用した結果、直接及び間接的に生じた損害について、株式会社ハ
  ドソンは、一切の責任または債務を負わないものとします。

・本ソフトウェアの操作方法、技術的内容、その他の質問について、株式会社ハドソン
  では、直接お答えしていません。お問い合わせはご遠慮下さい。

・本ソフトウェアの使用に際し、「ソフトウェアのご使用条件」をよくご覧いただき、
  ご利用下さいますようお願い致します。

・本ソフトウェアの著作権は、株式会社ハドソンが保有しています。


MS-DOSは米国マイクロソフト社の登録商標です。
その他、記載されている会社名、製品名は、各社の登録商標または商標です。


                                                            (C)1995 HUDSON SOFT
